﻿/*
 * Created by SharpDevelop.
 * User: Administrator
 * Date: 2016/11/13
 * Time: 6:46
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Drawing;
using System.Windows.Forms;
using NetCDFDotnet;
using System.Collections.Generic;

namespace GeoFly
{
	/// <summary>
	/// Description of NetCDF_Form.
	/// </summary>
	public partial class NetCDF_Form : Form
	{
		NetCDFDotnet.NCFile file = null;
		public NetCDF_Form()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
		}
		void Button1Click(object sender, EventArgs e)
		{
			OpenFileDialog dialog = new OpenFileDialog();
			if (dialog.ShowDialog() == DialogResult.OK) {
				file = new NCFile(dialog.FileName, OpenMode.read);
				listBoxVars.Items.Clear();
				comboBox_lat.Items.Clear();
				comboBox_long.Items.Clear();
				for (int i = 0; i < file.variables.Length; i++) {
					NCVariable var = file.variables[i];
					listBoxVars.Items.Add(var.name);
					comboBox_lat.Items.Add(var.name);
					comboBox_long.Items.Add(var.name);
					if (var.name.Length > 2 && var.name.ToLower().Substring(0, 3) == "lat") {
						comboBox_lat.Text = var.name;
						this.latVar = var;
					}
					if (var.name.Length > 2 && var.name.ToLower().Substring(0, 3) == "lon") {
						comboBox_long.Text = var.name;
						this.lonVar = var;
					}
					
				}
				button1.Enabled = false;
			}
	
		}
		void Button3Click(object sender, EventArgs e)
		{
			if (file != null) {
				file.Close();
				button1.Enabled = true;
				button3.Enabled = false;
				listBoxVars.Items.Clear();
				comboBox_lat.Items.Clear();
				comboBox_long.Items.Clear();
			}
		}
		void ListBoxVarsSelectedIndexChanged(object sender, EventArgs e)
		{
			NCVariable var = file.variables[listBoxVars.SelectedIndex];
			richTextBox1.Text = var.name + ":" + var.nc_type + "\nDimensions:";
			for (int i = 0; i < var.Dimensions.Length; i++) {
				richTextBox1.Text += var.Dimensions[i].dimname + " ";
			}
			richTextBox1.Text += "\n";
			for (int i = 0; i < var.Atributes.Count; i++) {
				richTextBox1.Text += var.Atributes.Keys[i] + "=" + var.Atributes.Values[i].value + "\n";
			}
		}
		void NetCDF_FormLoad(object sender, EventArgs e)
		{
	
		}
		NCVariable latVar = null;
		NCVariable lonVar = null;
		SortedList<string,NCVariable> SelectedVars = new SortedList<string, NCVariable>();
		List<int> levelIndice = new List<int>();
		void ComboBox_longSelectedIndexChanged(object sender, EventArgs e)
		{
			lonVar = file.variables[comboBox_long.SelectedIndex];
		}
		void ComboBox_latSelectedIndexChanged(object sender, EventArgs e)
		{
			latVar = file.variables[comboBox_lat.SelectedIndex];
		}
		void Button2Click(object sender, EventArgs e)
		{
			object varname = listBoxVars.SelectedItem.ToString();
			if (!listBox2.Items.Contains(varname)) {
				listBox2.Items.Add(varname);
				NCVariable var = null;
				for (int i = 0; i < file.variables.Length; i++) {
					if (varname.ToString() == file.variables[i].name) {
						SelectedVars.Add(varname.ToString(), file.variables[i]);
						levelIndice.Add(0);
					}
				}
			}
		}
		NCVariable currentVar = null;
		void ListBox2SelectedIndexChanged(object sender, EventArgs e)
		{
			currentVar =	SelectedVars[listBox2.SelectedItem.ToString()];
			if (currentVar.Dimensions.Length == 3) {
				comboBox_Level.Enabled = false;
				
			}
			if (currentVar.Dimensions.Length == 4) {
				comboBox_Level.Enabled = true;
				NC_Dimension dim = currentVar.Dimensions[1];
				
				for (int i = 0; i < dim.length; i++) {
					
					comboBox_Level.Items.Add(i);
				}
			}
	
		}
		void Button4Click(object sender, EventArgs e)
		{
			SelectedVars.Clear();
			levelIndice.Clear();
			listBox2.Items.Clear();
		}
		void ComboBox_LevelSelectedIndexChanged(object sender, EventArgs e)
		{
			int v = comboBox_Level.SelectedIndex;
			levelIndice[listBox2.SelectedIndex] = v;
		}
		void ComboBox5SelectedIndexChanged(object sender, EventArgs e)
		{
			if (comboBox_process.SelectedIndex == 0 || comboBox_process.SelectedIndex == 1) {
				label_Parameters.Text = "参数表：起始经度,起始纬度,结束经度，结束纬度，分辨率";
			}
		}
		void Button6Click(object sender, EventArgs e)
		{
			FolderBrowserDialog dialog = new FolderBrowserDialog();
			if (dialog.ShowDialog() == DialogResult.OK) {
				textBox2.Text = dialog.SelectedPath;
			}
		}
		void Button5Click(object sender, EventArgs e)
		{
			int levelIndex = comboBox_Level.SelectedIndex;
			this.button5.Enabled = false;
			//Time
			for (int ti = 0; ti < file.dimensions[2].length; ti++) {
				//Var
				string[] param = this.textBox_Parameters.Text.Split(new char[]{ ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
				float lat0 = Convert.ToSingle(param[1]);
				float lon0 = Convert.ToSingle(param[0]);
				float lat1 = Convert.ToSingle(param[3]);
				float lon1 = Convert.ToSingle(param[2]);
				float resol = Convert.ToSingle(param[4]);
				int rows = (int)((lat1 - lat0) / resol);
				int cols = (int)((lon1 - lon0) / resol);
				float[] lats = new float[rows];
				for (int ind = 0; ind < rows; ind++) {
					lats[ind] = lat0 + ind * resol;
				}
				float[] lons = new float[cols];
				for (int ind = 0; ind < cols; ind++) {
					lons[ind] = lon0 + ind * resol;
				}
				int id = 0;
				NetCDFDotnet.NC_LowAPI.nc_create(file.ToString() + "_" + ti.ToString("0000") + ".nc", 1, ref id);
				label7.Text = "Processing " + ti;
				
				Application.DoEvents();
				int LonDimId = -1;
				NC_LowAPI.nc_def_dim(id, "lon", cols, ref LonDimId);
				int LatDimId = -1;
				NC_LowAPI.nc_def_dim(id, "lat", rows, ref LatDimId);
				int varId = -1;
				int lonid = -1;
				int latid = -1;
				NC_LowAPI.nc_def_var(id, "lon", NC_Type.NC_FLOAT, 1, new int[]{ LonDimId }, ref lonid);
				NC_LowAPI.nc_def_var(id, "lat", NC_Type.NC_FLOAT, 1, new int[]{ LatDimId }, ref latid);
				for (int i = 0; i < listBox2.Items.Count; i++) {
					string varName = listBox2.Items[0].ToString();
					NC_LowAPI.nc_def_var(id, varName, NC_Type.NC_FLOAT, 2, new int[] {
						LatDimId,
						LonDimId
					}, ref varId);
				}
				NC_LowAPI.nc_enddef(id);
				for (int i = 0; i < listBox2.Items.Count; i++) {
					string varName = listBox2.Items[0].ToString();
					NCVariable ncvar = null;
					for (int vi = 0; vi < file.variables.Length; vi++) {
						if (file.variables[vi].name == varName) {
							ncvar = file.variables[vi];
							break;
						}
					}
					NC_Data2d ncData = file.GetData2D(varName, "lon", "lat", ti, comboBox_Level.SelectedIndex);
					double[,] data = ncData.Data;
					//重采样
					
					
					float[,] result = null;
					if (comboBox_process.SelectedIndex == 0)
						result = MatrixFuncs.ReGridBilinear(data, ncData.YCoord, ncData.XCoord, lats, lons);
					else if (comboBox_process.SelectedIndex == 1)
						result = MatrixFuncs.ReGridNearest(data, ncData.YCoord, ncData.XCoord, lats, lons);
					else
						result = MatrixFuncs.ReGridLambert(data, ncData.YCoord, ncData.XCoord, 10, 70, 6000, 600, 600, 35, 105, 30, 60);
								
					
				
				
				
				
					float[] values = new float[rows * cols];
					for (int row = 0; row < rows; row++) {
						for (int col = 0; col < cols; col++) {
							values[row * cols + col] = (float)result[row, col];
						}
					}
				
					
					NC_LowAPI.nc_put_var_float(id, varId, values);
					NC_LowAPI.nc_put_var_float(id, latid, lats);
					NC_LowAPI.nc_put_var_float(id, lonid, lons);
					
				
					//ncData.Data
					//创建磁盘文件nc
					//写入磁盘
				}
				NC_LowAPI.nc_close(id);
			}
			this.button5.Enabled = true;
		}
		
	}
}
